key controller: Don't eat modifier events
authorMatthias Clasen <mclasen@redhat.com>
Mon, 13 May 2019 17:01:51 +0000 (17:01 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 13 May 2019 17:01:51 +0000 (17:01 +0000)
The key controller was consuming key events
for modifier keys, for no entirely convincing
reason, which leads to problems when somebody
actually listens for those, such as the simple
input method does for C-S-u processing.

Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1884
gtk/gtkeventcontrollerkey.c

index 6ca7020ef7658e83adaa4cbff61c22ce41d4bef6..0ffb4f3eba8a822219e4f095aaf2f4f9e78eae1b 100644 (file)
@@ -46,6 +46,8 @@ struct _GtkEventControllerKey
   GtkIMContext *im_context;
   GHashTable *pressed_keys;
 
+  GdkModifierType state;
+
   const GdkEvent *current_event;
 
   guint is_focus       : 1;
@@ -141,10 +143,10 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
 {
   GtkEventControllerKey *key = GTK_EVENT_CONTROLLER_KEY (controller);
   GdkEventType event_type = gdk_event_get_event_type (event);
-  gboolean handled, is_modifier;
   GdkModifierType state;
   guint16 keycode;
   guint keyval;
+  gboolean handled = FALSE;
 
   if (event_type == GDK_FOCUS_CHANGE)
     {
@@ -180,24 +182,15 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
       return TRUE;
     }
 
-  if (!gdk_event_get_state (event, &state) ||
-      !gdk_event_get_key_is_modifier (event, &is_modifier))
-    return FALSE;
-
   key->current_event = event;
 
-  if (is_modifier)
+  gdk_event_get_state (event, &state);
+  if (key->state != state)
     {
-      if (event_type == GDK_KEY_PRESS)
-        g_signal_emit (controller, signals[MODIFIERS], 0, state, &handled);
-      else
-        handled = TRUE;
+      gboolean unused;
 
-      if (handled == TRUE)
-        {
-          key->current_event = NULL;
-          return TRUE;
-        }
+      key->state = state;
+      g_signal_emit (controller, signals[MODIFIERS], 0, state, &unused);
     }
 
   gdk_event_get_keycode (event, &keycode);